import axios from "axios";
import store from "@/store";
import router from "@/router";
import { Toast } from "vant";
import { refreshTokenApi } from "@/api/user";
const request = axios.create({
  // 1.配置基地址
  baseURL: "https://toutiao.itheima.net",
  // 2.请求超时
  timeout: 3000,
});
// 请求拦截器
request.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // console.log(config);
    const { token } = store.state.user;
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data;
  },
  async (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。

    if (error.response.status === 401) {
      //情况1.token过期了，refreshToken没过期
      try {
        // 无感刷新
        const resp = await refreshTokenApi();
        console.log("token过期了");
        const { token } = resp.data.data;
        // 用新token去覆盖旧token
        store.commit("user/setToken", token);
        // 4，用得到的新的token继续之前未遂的请求
        // 继续调用request发请求，error,config取的请求失败接口的所有请求信息
        return request(error.config);
      } catch (error) {
        //情况2.token过期了，refreshToken也过期了
        console.log("refreshToken过期了");
        if (error.response.data.message === "refresh_token失效") {
          Toast("登录过期，请重新登录");
          // 清空vuex中的token和refreshtoken
          store.dispatch("user/logoutAction");
          // 跳转到登录页面,并携带回跳地址
          // $route: 当前激活的路的对象(在组件中用)
          // router.currentRoute: 当前激活的路由的对象(在js模块中用)
          router.replace(`/login?redirectUrl=${router.currentRoute.path}`);
        }
      }

      // 或用axios发请求代码会多一点
      // return axios({
      //   ...error.config,
      //   url: `https://toutiao.itheima.net${error.config.url}`,
      //   headers:{
      //   Authorization:`Bearer ${resp.data.data.token}`
      // }
      // });
    }

    // 对响应错误做点什么
    return Promise.reject(error);
  }
);

export default request;
// token续签的思路:

//前提：有很多接口发给服务器的时候(请求拦截器中统一携带)，需要携带token,
// 但如果发给服务器的token是一个过期的，此次请求会失败,服务器会响应401状态码

// 1.当token过期了，在响应拦截器中统一处理

// 2.通过refreshToken去获取一个新的token（refreshToken有效期比token长）

// 3.用得到的新的token继续之前的未遂的请求
